#include "NumerosPrimos.h"

using namespace Encriptacion;


NumerosPrimos::NumerosPrimos() {
	this->path = "NumerosPrimos.txt";
	this->archivoNumerosPrimosFstream.open(this->path.c_str(), ios::in);

	if (!archivoNumerosPrimosFstream.good()) {
		archivoNumerosPrimosFstream.open(path.c_str(), ios::in | ios::trunc);
		archivoNumerosPrimosFstream.clear();
		cout << "Error: No se encuentra el archivo de numeros primos: " + this->path ;
	}
}

string NumerosPrimos::leerLinea(){
	string linea;
	this->archivoNumerosPrimosFstream >> linea;
	return linea;
}

string NumerosPrimos::leerLinea(int pos){
	string linea;
	this->archivoNumerosPrimosFstream.seekg(pos);
	this->archivoNumerosPrimosFstream >> linea;
	return linea;
}

unsigned long long  NumerosPrimos::leerNumero(int pos){
	string numeroPrimoChar = this->leerLinea(pos);
	return atoll(numeroPrimoChar.c_str());
}

bool NumerosPrimos::finDeArchivo() {
	return this->archivoNumerosPrimosFstream.eof();
}

//debe devolver en p y q dos numeros primos que multiplicados no superen la cantidad de bits
// que tiene el numero n
void NumerosPrimos::getParNumerosPrimos(unsigned long long &p, unsigned long long &q,int n){

	int cantBitsN = n*8;
	int cantidadLineasArchivo = 9591;

	// elijo una linea entre el 30% y el 60% del archivo
	srand(time(NULL));
	int random = rand() % ((int)cantidadLineasArchivo* 0,6) + ((int)cantidadLineasArchivo*0,3);

	p = this->leerNumero(random*7);
	int cantBitsNum = ceil(log2(p));

	int dif = cantBitsN - cantBitsNum;
	unsigned long long maximo = pow(2,dif);

	bool qEncontrado = false;
	while(!qEncontrado){
		random = rand() % cantidadLineasArchivo;
		q = this->leerNumero(random*7);

		if(q <= maximo && p!=q){
			qEncontrado = true;
		}
	}
}

NumerosPrimos::~NumerosPrimos() {
	this->archivoNumerosPrimosFstream.close();
}
